package cn.edu.nwpu.warehousemanagement.service;

import cn.edu.nwpu.warehousemanagement.pojo.Freight;
import cn.edu.nwpu.warehousemanagement.pojo.Result;
import cn.edu.nwpu.warehousemanagement.pojo.dto.*;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 主要包含Freight的查找服务
 * @author LSR
 */
public interface FreightService {
    /**
     * 获取在库货物，不带分页
     * @return 在库货物列表
     */
    Result<List<Freight>> getInStockFreights();

    /**
     * 获取出库货物，不带分页
     * @return 出库货物列表
     */
    Result<List<Freight>> getOutboundFreights();

    /**
     * 根据ID查询货物
     * @param idDTO 包含ID的DTO
     * @return 单个货物信息
     */
    Result<Freight> getFreightById(IDDTO idDTO);

    // 根据货架ID获取在库货物（不分页）
    Result<List<Freight>> getInStockFreightsByShelfId(Long shelfId);





    //region 分页获取请求
    /**
     * 获取所有货物（包括在库和出库），带分页
     * @param pageDTO 分页信息
     * @return 分页的货物列表
     */
    Result<Page<Freight>> getAllFreights(PageDTO pageDTO);

    /**
     * 获取在库货物，带分页
     * @param pageDTO 分页信息
     * @return 分页的在库货物列表
     */
    Result<Page<Freight>> getInStockFreights(PageDTO pageDTO);

    /**
     * 获取出库货物，带分页
     * @param pageDTO 分页信息
     * @return 分页的出库货物列表
     */
    Result<Page<Freight>> getOutboundFreights(PageDTO pageDTO);

    /**
     * 根据名称查询货物
     * @param nameDTO 包含名称的DTO
     * @param pageDTO 分页信息（可选）
     * @return 货物列表（分页或不分页）
     */
    Result<?> getFreightsByName(NameDTO nameDTO, PageDTO pageDTO);

    // 根据货架ID获取在库货物（分页）
    Result<Page<Freight>> getInStockFreightsByShelfIdWithPage(Long shelfId, PageDTO pageDTO);


    //按名称模糊分页查询Freight
    Result<Page<Freight>> searchInStockFreightsByProductName(String productName, int pageNum, int pageSize);
    Result<Page<Freight>> searchOutStockFreightsByProductName(String productName, int pageNum, int pageSize);

    Result<Page<Freight>> getInStockFreightsByShelfAndProductName(Long ShelfId, String productName, int pageNum, int pageSize);
    Result<Page<Freight>> getOutStockFreightsByShelfAndProductName(Long ShelfId, String productName, int pageNum, int pageSize);

    //endregion
}